
//1034.边界着色
class Solution {
public:
    vector<vector<int>> colorBorder(vector<vector<int>>& grid, int row, int col, int color) {
        int n=grid.size(),m=grid[0].size();
        int dx[]={0,0,1,-1};
        int dy[]={1,-1,0,0};
        
        int tar=grid[row][col];
        vector<vector<int>> vis(n,vector<int>(m));
        function<void(int,int)> dfs=[&](int x,int y)
        {
            vis[x][y]=1;
            for(int k=0;k<4;k++)
            {
                int a=x+dx[k];
                int b=y+dy[k];
                if(a>=0&&a<n&&b>=0&&b<m&&grid[a][b]==tar&&!vis[a][b]) dfs(a,b);   //旁边存在相同的数,可以向左右扩展
                else if(a<0||a>=n||b<0||b>=m||(grid[a][b]!=tar&&!vis[a][b])) grid[x][y]=color;   //旁边存在不是tar的数据并且该数不是改变过的数
            }
        };

        dfs(row,col);
        return grid;
    }
};